/*
 * In the header file there are constants and arrays for static evaluation
 * function and Alpha-beta.
 * 
 * Author: Pavel Veselý
 * License: GPL v3, see license.txt
*/
#ifndef ALPHABETA_H_INCLUDED
#define ALPHABETA_H_INCLUDED

#include "tzaarlib.h"
//array for hasing
#include "hashedpositions.h"

#define ZONE_OF_CONTROL_HEIGHT 1
#define THREAT_HEIGHT 1000
#define THREAT_HEIGHT_MULT 20000	// for the player on move -- he is going to win!
#define FULL_SECURE 500000
#define SECURE_TYPE 25000
#define FIELD_VALUE_MULT 3
#define ZOC_CRITICAL_SUM 4
#define ZOC_CRITICAL_BONUS 100000
#define STACK_OF_ALL_TYPES_BONUS 100000

//transposition tables
#define EXACT_VALUE 0
#define LOWER_BOUND -1
#define UPPER_BOUND 1
#define TTSIZE (1 << 19)

//history heuristics
i32 historyPruneMoves[BOARD_ARRAY_SIZE][BOARD_ARRAY_SIZE];	//only for first move of player

//transposition tables
typedef struct ttEntry {
	thash hash;
	Move *bestMove1, *bestMove2;
	i32 value, valueType;	//type is EXACT_VALUE, LOWER_BOUND or UPPER_BOUND
	i32 searchDepth;
	u32 searchedNodes;
} TTEntry;
TTEntry *TranspositionTable[2 * TTSIZE];	//2* because of replacement schema Twobig

//for random selecting
typedef struct fullMovesList {
	Move *move1, *move2;
	i32 value;		//value that is determined by search after executing the moves
	struct fullMovesList *next;
} FullMovesList;

static __attribute__ ((unused))
i32 StackHeightValue[] = { 0, 10, 100, 150, 155, 160, 160, 160, 160, 150, 140, 130, 100, 90, 60 };

static __attribute__ ((unused))
i32 StackHeightValueBeginner[] = { 0, 10, 50, 110, 180, 250, 300, 350, 400, 450, 500, 550, 600, 650, 700 };

static __attribute__ ((unused))
i32 StackByCountValue[] = { 0, 100, 90, 60, 30, 20, 15, 10, 8, 6, 5, 4, 3, 2, 1, 1 };

static __attribute__ ((unused))
i32 CountValue[] = { 0, 1, 2, 6, 12, 30, 90, 200, 400, 600, 800, 900, 1000, 1000, 1000, 1000 };

static __attribute__((unused))
i32 PossibleMovesFromField[] = {
	11  , 16  , 16  , 16  , 11  , 100 , 100 , 100 , 100 ,
	16  , 13  , 18  , 18  , 13  , 16  , 100 , 100 , 100 ,
	16  , 18  , 15  , 20  , 15  , 18  , 16  , 100 , 100 ,
	16  , 18  , 20  , 17  , 17  , 20  , 18  , 16  , 100 ,
	11  , 13  , 15  , 17  , 100 , 17  , 15  , 13  , 11  ,
	100 , 16  , 18  , 20  , 17  , 17  , 20  , 18  , 16  ,
	100 , 100 , 16  , 18  , 15  , 20  , 15  , 18  , 16  ,
	100 , 100 , 100 , 16  , 13  , 18  , 18  , 13  , 16  ,
	100 , 100 , 100 , 100 , 11  , 16  , 16  , 16  , 11
};
//for ZOC -- stacks in the center are more powerful
static __attribute__((unused))
i32 StackValueByField[][BOARD_ARRAY_SIZE] = {
{
	 0  ,  0  ,  0  ,  0  ,  0  , 100 , 100 , 100 , 100 ,
	 0  ,  0  ,  0  ,  0  ,  0  ,  0  , 100 , 100 , 100 ,
	 0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  , 100 , 100 ,
	 0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  , 100 ,
	 0  ,  0  ,  0  ,  0  , 100 ,  0  ,  0  ,  0  ,  0  ,
	100 ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,
	100 , 100 ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,
	100 , 100 , 100 ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,
	100 , 100 , 100 , 100 ,  0  ,  0  ,  0  ,  0  ,  0  }, 
{
	 0  ,  0  ,  0  ,  0  ,  0  , 100 , 100 , 100 , 100 ,
	 0  ,  0  ,  0  ,  0  ,  0  ,  0  , 100 , 100 , 100 ,
	 0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  , 100 , 100 ,
	 0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  , 100 ,
	 0  ,  0  ,  0  ,  0  , 100 ,  0  ,  0  ,  0  ,  0  ,
	100 ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,
	100 , 100 ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,
	100 , 100 , 100 ,  0  ,  0  ,  0  ,  0  ,  0  ,  0  ,
	100 , 100 , 100 , 100 ,  0  ,  0  ,  0  ,  0  ,  0  }, 
{
	-10 ,  0  ,  0  ,  0  , -10 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-10 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -10 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -10 ,  0  ,  0  ,  0  , -10 }, 
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 }, 
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 },
{
	-30 ,  0  ,  0  ,  0  , -30 , 100 , 100 , 100 , 100 ,
	 0  , 10  , 15  , 15  , 10  ,  0  , 100 , 100 , 100 ,
	 0  , 15  , 18  , 25  , 18  , 15  ,  0  , 100 , 100 ,
	 0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  , 100 ,
	-30 , 10  , 18  , 16  , 100 , 16  , 18  , 10  , -30 ,
	100 ,  0  , 15  , 25  , 16  , 16  , 25  , 15  ,  0  ,
	100 , 100 ,  0  , 15  , 18  , 25  , 18  , 15  ,  0  ,
	100 , 100 , 100 ,  0  , 10  , 15  , 15  , 10  ,  0  ,
	100 , 100 , 100 , 100 , -30 ,  0  ,  0  ,  0  , -30 }
};


// -------
// FUNCTIONS 
// -------
// static evaluators
i32 StaticValue();
i32 StaticValueBeginner();

// transposition tables functions
TTEntry *LookupPositionInTT();
bool CompareTTEntries(TTEntry * a, TTEntry * b);
void FreeTTEntry(TTEntry * entry);

// Alpha-beta with different enhancements
i32 AlphaBeta(i32 depth, i32 alpha, i32 beta);
i32 AlphaBetaPV(i32 depth, i32 alpha, i32 beta);
i32 AlphaBetaPVMO(i32 depth, i32 alpha, i32 beta);
i32 AlphaBetaMO(i32 depth, i32 alpha, i32 beta, Move ** m1, Move ** m2);
i32 AlphaBetaPVMORandom(i32 depth, i32 randomMargin);
i32 AlphaBetaPVMONegascout(i32 depth, i32 alpha, i32 beta);
i32 AlphaBetaPVMOHistory(i32 depth, i32 alpha, i32 beta);
i32 AlphaBetaPVMOHistoryNegascout(i32 depth, i32 alpha, i32 beta);
i32 AlphaBetaPVMOBeginner(i32 depth, i32 alpha, i32 beta);
i32 AlphaBetaPVMORandomBeginner(i32 depth, i32 randomMargin);

#endif				// ALPHABETA_H_INCLUDED
